package main

import (
	"fmt"
	"github.com/casbin/casbin/v2"
	"log"
)

// check 权限检查函数
// 功能：验证指定用户对特定资源是否有操作权限
// 参数：
//   - e: Casbin执行器实例
//   - sub: 主体（用户或角色）
//   - obj: 资源对象
//   - act: 操作类型
func check(e *casbin.Enforcer, sub, obj, act string) {
	// 使用Casbin执行器进行权限验证
	ok, _ := e.Enforce(sub, obj, act)

	// 根据权限检查结果输出相应信息
	if ok {
		fmt.Printf("%s CAN %s %s\n", sub, act, obj)
	} else {
		fmt.Printf("%s CANNOT %s %s\n", sub, act, obj)
	}
}

// main 程序主入口
// 功能：演示Casbin基于角色的访问控制(RBAC)功能
func main() {
	// 初始化Casbin权限执行器
	// 加载模型文件和策略文件，支持RBAC模式
	e, err := casbin.NewEnforcer("./model.pml", "./policy.csv")
	if err != nil {
		log.Fatalf("NewEnforcer failed:%v\n", err)
	}

	// RBAC功能演示 - 角色权限管理（当前注释掉，仅作代码示例）
	// 为角色"kuaiji"添加对资源"/users"的GET操作权限
	// e.AddPolicy("kuaiji", "/users", "GET")

	// 将用户"zhangsan"分配给角色"kuaiji"
	// e.AddRoleForUser("zhangsan", "kuaiji")

	// 移除用户"zhangsan"与角色"kuaiji"的关联关系
	// e.RemoveGroupingPolicy("zhangsan", "/users", "GET")

	// 保存角色分配关系到持久化存储
	// e.SavePolicy()

	// 基础权限检查演示
	check(e, "zhangsan", "/index", "GET")  // 检查张三是否有权限GET访问/index
	check(e, "zhangsan", "/home", "GET")   // 检查张三是否有权限GET访问/home
	check(e, "zhangsan", "/users", "POST") // 检查张三是否有权限POST访问/users

	// 动态角色分配演示
	// 为用户"wangwu"分配"admin"角色
	e.AddRoleForUser("wangwu", "admin")
	// 保存策略更改到持久化存储
	e.SavePolicy()

	// 验证角色分配后的权限
	check(e, "wangwu", "/users", "POST") // 检查王五（admin角色）是否有权限POST访问/users
}
